/**
 *  给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 的那两个整数，并返回它们的数组下标。

		你可以假设每种输入只会对应一个答案。但是，数组中同一个元素不能使用两遍。

		你可以按任意顺序返回答案。

		示例 1：

		输入：nums = [2,7,11,15], target = 9
		输出：[0,1]
		解释：因为 nums[0] + nums[1] == 9 ，返回 [0, 1] 。
		示例 2：

		输入：nums = [3,2,4], target = 6
		输出：[1,2]
		示例 3：

		输入：nums = [3,3], target = 6
		输出：[0,1]
 *
 */

/**
 * 计算两数之和方法
 * 解题思路：
 *    数组本质上为对象的一种，其key为0、1、2、3，将其value与key相互调换
 *    遍历数组，算出另外一个数字应该为多少，并在转换后的对象中进行匹配，如果匹配到，直接返回对应位置即可
 * @param nums {number[]} 要计算的数组list
 * @param target {number} 两个数字的合
 * @return {number[]} 找到数字的下标
 */
function twoSum(nums, target) {
	// 将数组转换为对象
	const convertNumberToObject = {};

	Object.keys(nums).forEach((index) => {
		const currentNumb = nums[index];
		convertNumberToObject[currentNumb] = +index; // 注意，此处的index为string
	})

	//  开始遍历数组
	let i = 0;

	while (i < nums.length) {
		//  算出与当前数字相加与target相同的数字
		const targetNumb = target - nums[i];

		//  找出目标数字在转换后对象中的位置
		const targetIndex = convertNumberToObject[targetNumb];

		if (
			targetIndex === undefined || // 不存在的情况
			targetIndex === i //  存在，但是该数字自己
		) {
			i++;
		} else {
			return [i, targetIndex]; //
		}
	}
}

export default twoSum;
